<!DOCTYPE html>
<html>
  <head>
    <meta charset="utf-8" >

<title>《图解HTTP》读书笔记 | 迷航</title>
<meta name="description" content="人可以迷失方向，但是不能停下脚步！">

<meta name="viewport" content="width=device-width, initial-scale=1, maximum-scale=1, user-scalable=no">

<link rel="stylesheet" href="https://use.fontawesome.com/releases/v5.7.2/css/all.css" integrity="sha384-fnmOCqbTlWIlj8LyTjo7mOUStjsKC4pOpQbqyi7RrhN7udi9RwhKkMHpvLbHG9Sr" crossorigin="anonymous">
<link rel="shortcut icon" href="https://tingke.gitee.io/post/favicon.ico?v=1690805106645">
<link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/KaTeX/0.10.0/katex.min.css">
<link rel="stylesheet" href="https://tingke.gitee.io/post/styles/main.css">



<script src="https://cdn.jsdelivr.net/npm/vue/dist/vue.js"></script>
<script src="https://cdn.bootcss.com/highlight.js/9.12.0/highlight.min.js"></script>

<link rel="stylesheet" href="https://unpkg.com/aos@next/dist/aos.css" />



  </head>
  <body>
    <div id="app" class="main">

      <div class="sidebar" :class="{ 'full-height': menuVisible }">
  <div class="top-container" data-aos="fade-right">
    <div class="top-header-container">
      <a class="site-title-container" href="https://tingke.gitee.io/post">
        <img src="https://tingke.gitee.io/post/images/avatar.png?v=1690805106645" class="site-logo">
        <h1 class="site-title">迷航</h1>
      </a>
      <div class="menu-btn" @click="menuVisible = !menuVisible">
        <div class="line"></div>
      </div>
    </div>
    <div>
      
        
          <a href="/" class="site-nav">
            首页
          </a>
        
      
        
          <a href="/archives" class="site-nav">
            归档
          </a>
        
      
        
          <a href="/tags" class="site-nav">
            标签
          </a>
        
      
        
          <a href="/post/about" class="site-nav">
            关于
          </a>
        
      
    </div>
  </div>
  <div class="bottom-container" data-aos="flip-up" data-aos-offset="0">
    <div class="social-container">
      
        
      
        
      
        
      
        
      
        
      
    </div>
    <div class="site-description">
      人可以迷失方向，但是不能停下脚步！
    </div>
    <div class="site-footer">
      Powered by <a href="https://github.com/getgridea/gridea" target="_blank">Gridea</a> Copyright © 2019 | <a class="rss" href="https://tingke.gitee.io/post/atom.xml" target="_blank">RSS</a>
    </div>
  </div>
</div>


      <div class="main-container">
        <div class="content-container" data-aos="fade-up">
          <div class="post-detail">
            <h2 class="post-title">《图解HTTP》读书笔记</h2>
            <div class="post-date">2018-06-29</div>
            
            <div class="post-content">
              <h2 id="tcpip-协议族分层">TCP/IP 协议族分层</h2>
<ol>
<li>应用层
<ul>
<li>向用户提供应用服务，如：<code>HTTP（HyperText Transfer Protocol，超文本传输协议）</code>、<code>FTP（File Transfer Protocol，文件传输协议）</code>、<code>DNS（Domain Name System，域名系统）</code>等</li>
</ul>
</li>
<li>传输层
<ul>
<li>为应用层提供处于网络连接中的客户端和服务端的数据传输，如 TCP<code>（Transmission Control Protocol，传输控制协议）</code>、UDP<code>（User Data Protocol，用户数据报协议）</code></li>
</ul>
</li>
</ol>
<!-- more -->
<ol start="3">
<li>网络层
<ul>
<li>用来处理在网络上流动的数据包，为数据包的传输选择一条传输线路，如：<code>IP（Internet Protocol，网际协议）</code></li>
</ul>
</li>
<li>数据链路层
<ul>
<li>处理连接网络的硬件部分，如：光纤、网卡、驱动等</li>
</ul>
</li>
</ol>
<p>传输图解<br>
<img src="http://outiw4np3.bkt.clouddn.com/15e41c7da0dd411dabdbbad1266da079.jpg" alt="" loading="lazy"></p>
<h2 id="与-http-紧密相连的tcpip-协议族">与 HTTP 紧密相连的TCP/IP 协议族</h2>
<h3 id="负责传输的-ip-协议">负责传输的 IP 协议</h3>
<p>“IP 协议的作用是把各种数据包传送给对方。而要保证确实传送到对方那里，则需要满足各类条件。其中两个重要的条件是 IP 地址和 MAC 地址（Media Access Control Address）。</p>
<p>IP 地址指明了节点被分配到的地址，MAC 地址是指网卡所属的固定地址。IP 地址可以和 MAC 地址进行配对。IP 地址可变换，但 MAC 地址基本上不会更改。”</p>
<h3 id="确保可靠性的-tcp-协议">确保可靠性的 TCP 协议</h3>
<p>“为了准确无误地将数据送达目标处，TCP 协议采用了<strong>三次握手</strong>（three-way handshaking）策略。用 TCP 协议把数据包送出去后，TCP 不会对传送后的情况置之不理，它一定会向对方确认是否成功送达。握手过程中使用了 TCP 的标志（flag） —— SYN（synchronize） 和 ACK（acknowledgement）”<br>
<img src="http://outiw4np3.bkt.clouddn.com/757742571edfeb7cf1146efeed251d2f.jpg" alt="" loading="lazy"></p>
<p>TCP 为什么是三次握手，不是两次或四次呢？</p>
<pre><code>三次握手：
“喂，你听得到吗？”
“我听得到呀，你听得到我吗？”
“我能听到你，今天balabala……”

两次握手：
“喂，你听得到吗？”
“我听得到呀”
“喂喂，你听得到吗？”
“草，我听得到呀！！！！”
“你TM能不能听到我讲话啊！！喂！”
“……”

四次握手：
“喂，你听得到吗？”
“我听得到呀，你听得到我吗？”
“我能听到你，你能听到我吗？”
“……不想跟傻逼说话”

--来自知乎的段子
</code></pre>
<p>可以看出四次握手显得过于庸余，而两次握手并不能确定双方的链接稳定了。</p>
<h3 id="负责域名解析的-dns-协议">负责域名解析的 DNS 协议</h3>
<p>计算机善于处理长串数字，但不容易理解名称；用户善于记忆名称，而不习惯记忆长串数字，于是 DNS 协议应运而生。</p>
<blockquote>
<p>“DNS 协议提供通过域名查找 IP 地址，或逆向从 IP 地址反查域名的服务”</p>
</blockquote>
<h3 id="http-与-dnstcpip-关系图">HTTP 与 DNS/TCP/IP 关系图</h3>
<figure data-type="image" tabindex="1"><img src="http://outiw4np3.bkt.clouddn.com/8cfb742e225135a59dde1c57682acd95.jpg" alt="" loading="lazy"></figure>
<h3 id="uri-和-url">URI 和 URL</h3>
<p>URI:（Uniform Resource Identifier，统一资源标识符）<br>
URL：(Uniform Resource Locator，统一资源定位符）</p>
<p>URI基本格式：<br>
<img src="http://outiw4np3.bkt.clouddn.com/bb1889fcf7a8d59ac92c161190334370.jpg" alt="" loading="lazy"></p>
<p>协议方案：获取访问资源时要指定协议类型，如ftp、https等<br>
登录信息：指定用户名和密码作为从服务器端获取资源时必要的登录信息（身份认证）<font color='red'>可选</font><br>
片段标识：使用片段标识符通常可标记出已获取资源中的子资源（文档内的某个位置）</p>
<h2 id="http-协议">HTTP 协议</h2>
<p>一个 HTTP 协议必定有两端，请求访问资源的一端为客户端，提供资源响应的一端为服务器端，并且 HTTP 协议能明确区分哪是客户端哪是服务器端。</p>
<p>下面是从客户端发送给某服务器的请求报文<br>
<img src="http://outiw4np3.bkt.clouddn.com/2baf0cb2cca193520fbb5bb85de31ab8.jpg" alt="" loading="lazy"></p>
<p><code>GET</code> 表示访问服务器的类型，俗称“方法”<br>
<code>//feed/v1/feed/get_attention_list?...uid=</code> 指明了访问的资源对象，也叫做“URI”<br>
<code>HTTP/1.1</code> 及 HTTP 的版本号，用来提示客户端使用的http协议功能</p>
<figure data-type="image" tabindex="2"><img src="http://outiw4np3.bkt.clouddn.com/297363515632a28a51650e64c6a68d56.jpg" alt="" loading="lazy"></figure>
<p><strong>请求报文</strong>是由请求方法、请求 URI、协议版本、可选的请求首部字段和内容实体构成的。</p>
<figure data-type="image" tabindex="3"><img src="http://outiw4np3.bkt.clouddn.com/68e6c6b31aadffeada3e2b572230a0c1.jpg" alt="" loading="lazy"></figure>
<p><strong>响应报文</strong>基本上由协议版本、状态码（表示请求成功或失败的数字代码）、用以解释状态码的原因短语、可选的响应首部字段以及实体主体构成</p>
<figure data-type="image" tabindex="4"><img src="http://outiw4np3.bkt.clouddn.com/54322dbb9d6225627c4c19a9fc48b1dd.jpg" alt="" loading="lazy"></figure>
<blockquote>
<p>“HTTP 是一种不保存状态，即无状态（stateless）协议。HTTP 协议自身不对请求和响应之间的通信状态进行保存。也就是说在 HTTP 这个级别，协议对于发送过的请求或响应都不做持久化处理”</p>
<p>“HTTP/1.1 虽然是无状态协议，但为了实现期望的保持状态功能，于是引入了 Cookie 技术。有了 Cookie 再用 HTTP 协议通信，就可以管理状态了”</p>
</blockquote>
<h3 id="http-方法">HTTP 方法</h3>
<table>
<thead>
<tr>
<th>类型</th>
<th>作用</th>
</tr>
</thead>
<tbody>
<tr>
<td>GET</td>
<td>获取资源</td>
</tr>
<tr>
<td>POST</td>
<td>传输实体的主体</td>
</tr>
<tr>
<td>PUT</td>
<td>传输文件</td>
</tr>
<tr>
<td>HEAD</td>
<td>获取报文首部</td>
</tr>
<tr>
<td>DELETE</td>
<td>删除文件</td>
</tr>
<tr>
<td>OPTIONS</td>
<td>查询支持的方法</td>
</tr>
<tr>
<td>TRACE</td>
<td>追踪路径</td>
</tr>
<tr>
<td>CONNECT</td>
<td>要求用隧道协议连接代理</td>
</tr>
</tbody>
</table>
<p><strong>方法名区分大小写，请注意要用大写字母</strong></p>
<h3 id="持久连接">持久连接</h3>
<p>“持久连接的好处在于减少了 TCP 连接的重复建立和断开所造成的额外开销，减轻了服务器端的负载。另外，减少开销的那部分时间，使 HTTP 请求和响应能够更早地结束，这样 Web 页面的显示速度也就相应提高了”</p>
<p>“持久连接使得多数请求以管线化（pipelining）方式发送成为可能。从前发送请求后需等待并收到响应，才能发送下一个请求。管线化技术出现后，不用等待响应亦可直接发送下一个请求”</p>
<h3 id="cookie-的状态管理">Cookie 的状态管理</h3>
<p>“Cookie 技术通过在请求和响应报文中写入 Cookie 信息来控制客户端的状态”</p>
<figure data-type="image" tabindex="5"><img src="http://outiw4np3.bkt.clouddn.com/cb588f16318cb814154c878fcbe44a0c.jpg" alt="" loading="lazy"></figure>
<h2 id="http-报文内的-http-信息">HTTP 报文内的 HTTP 信息</h2>
<p>用于 HTTP 协议交互的信息被称为 HTTP 报文。</p>
<h4 id="http-报文结构">HTTP 报文结构</h4>
<figure data-type="image" tabindex="6"><img src="http://outiw4np3.bkt.clouddn.com/7ce8b40311ecd74a53337a4e80fb762f.jpg" alt="" loading="lazy"></figure>
<h4 id="http-首部字段">HTTP 首部字段</h4>
<ol>
<li>
<p>通用首部字段</p>
<table>
<thead>
<tr>
<th>字段名</th>
<th>说明</th>
</tr>
</thead>
<tbody>
<tr>
<td>Cache-Control</td>
<td>控制缓存的行为</td>
</tr>
<tr>
<td>Connection</td>
<td>逐跳首部、连接的管理</td>
</tr>
<tr>
<td>Date</td>
<td>创建报文的日期</td>
</tr>
<tr>
<td>Pragma</td>
<td>报文指令</td>
</tr>
<tr>
<td>Trailer</td>
<td>报文末端的首部一揽</td>
</tr>
<tr>
<td>Transfer-Encoding</td>
<td>报文主体的传输编码方式</td>
</tr>
<tr>
<td>Upgrade</td>
<td>升级为其他协议</td>
</tr>
<tr>
<td>Via</td>
<td>代理服务器的信息</td>
</tr>
<tr>
<td>Warning</td>
<td>错误通知</td>
</tr>
</tbody>
</table>
</li>
<li>
<p>请求首部字段</p>
<table>
<thead>
<tr>
<th>字段名</th>
<th>说明</th>
</tr>
</thead>
<tbody>
<tr>
<td></td>
<td></td>
</tr>
</tbody>
</table>
</li>
<li>
<p>响应首部字段</p>
<table>
<thead>
<tr>
<th>字段名</th>
<th>说明</th>
</tr>
</thead>
<tbody>
<tr>
<td></td>
<td></td>
</tr>
</tbody>
</table>
</li>
<li>
<p>实体首部字段</p>
<table>
<thead>
<tr>
<th>字段名</th>
<th>说明</th>
</tr>
</thead>
<tbody>
<tr>
<td></td>
<td></td>
</tr>
</tbody>
</table>
</li>
</ol>
<h4 id="http-返回的状态码">HTTP 返回的状态码</h4>
<table>
<thead>
<tr>
<th>状态码</th>
<th>含义</th>
</tr>
</thead>
<tbody>
<tr>
<td>2XX</td>
<td>表明请求被正常处理</td>
</tr>
<tr>
<td>200</td>
<td>“表示从客户端发来的请求在服务器端被正常处理”</td>
</tr>
<tr>
<td>204</td>
<td>“代表服务器接收的请求已成功处理，但在返回的响应报文中不含实体的主体部分”</td>
</tr>
<tr>
<td>206</td>
<td>“表示客户端进行了范围请求，而服务器成功执行了这部分的 GET 请求。响应报文中包含由 Content-Range 指定范围的实体内容”</td>
</tr>
<tr>
<td>3XX</td>
<td>表明浏览器需要执行某些特殊的处理以正确处理请求</td>
</tr>
<tr>
<td>301</td>
<td>“永久性重定向。该状态码表示请求的资源已被分配了新的 URI，以后应使用资源现在所指的 URI”</td>
</tr>
<tr>
<td>302</td>
<td>“临时性重定向。该状态码表示请求的资源已被分配了新的 URI，希望用户（本次）能使用新的 URI 访问”</td>
</tr>
<tr>
<td>303</td>
<td>“由于请求对应的资源存在着另一个 URI，应使用 GET 方法定向获取请求的资源。”</td>
</tr>
<tr>
<td>304</td>
<td>“表示客户端发送附带条件的请求 2 时，服务器端允许请求访问资源，但未满足条件的情况”</td>
</tr>
<tr>
<td>307</td>
<td>“临时重定向。该状态码与 302 Found 有着相同的含义。”</td>
</tr>
<tr>
<td>4XX</td>
<td>“表明客户端是发生错误的原因所在。”</td>
</tr>
<tr>
<td>400</td>
<td>“该状态码表示请求报文中存在语法错误。当错误发生时，需修改请求的内容后再次发送请求”</td>
</tr>
<tr>
<td>401</td>
<td>“该状态码表示发送的请求需要有通过 HTTP 认证（BASIC 认证、DIGEST 认证）的认证信息”</td>
</tr>
<tr>
<td>403</td>
<td>“该状态码表明对请求资源的访问被服务器拒绝了”</td>
</tr>
<tr>
<td>5XX</td>
<td>“表明服务器本身发生错误”</td>
</tr>
<tr>
<td>500</td>
<td>“该状态码表明服务器端在执行请求时发生了错误。也有可能是 Web 应用存在的 bug 或某些临时的故障”</td>
</tr>
<tr>
<td>503</td>
<td>“表明服务器暂时处于超负载或正在进行停机维护，现在无法处理请求”</td>
</tr>
</tbody>
</table>
<h2 id="http-的缺点">HTTP 的缺点</h2>
<p>HTTP 主要有这些不足，例举如下。</p>
<ul>
<li>
<p>通信使用明文（不加密），内容可能会被窃听</p>
</li>
<li>
<p>不验证通信方的身份，因此有可能遭遇伪装</p>
</li>
<li>
<p>无法证明报文的完整性，所以有可能已遭篡改</p>
</li>
</ul>

            </div>
            
              <div class="tag-container">
                
                  <a href="https://tingke.gitee.io/post/tag/jZnXHuqi_/" class="tag">
                    📒读书笔记
                  </a>
                
              </div>
            
            
              <div class="next-post">
                <div class="next">下一篇</div>
                <a href="https://tingke.gitee.io/post/post/bei-ping-guo-qi-yong-de-pch/">
                  <h3 class="post-title">
                    被苹果弃用的PCH
                  </h3>
                </a>
              </div>
            

            

          </div>

        </div>
      </div>
    </div>

    <script src="https://unpkg.com/aos@next/dist/aos.js"></script>

<script type="application/javascript">

AOS.init();

hljs.initHighlightingOnLoad()

var app = new Vue({
  el: '#app',
  data: {
    menuVisible: false,
  },
})

</script>




  </body>
</html>
